Salt In Encryption

发布于 2018-01-04 09:36:11

为什么要加“盐”

一句话,加盐使得被“撞库”的成本大大提高。

是不是加了 Salt 之后就绝对安全了呢?淡然没有!坏人们还是可以他们数据字典中的密码,加上我们泄露数据库中的 Salt,然后散列,然后再匹配。但是由于我们的 Salt 是随机产生的,假如我们的用户数据表中有 30w 条数据,数据字典中有 600w 条数据,坏人们如果想要完全覆盖的坏,他们加上 Salt 后再散列的数据字典数据量就应该是 300000 * 6000000 = 1800000000000,一万八千亿啊,干坏事的成本太高了吧。但是如果只是想破解某个用户的密码的话,只需为这 600w 条数据加上 Salt,然后散列匹配。可见 Salt 虽然大大提高了安全系数,但也并非绝对安全。

具体参见下面链接。

登录中所使用的盐

不理解图中的协商密钥话,可以看看我之前的文章《Web中的加密算法》,可以得到点启发。

备注:

  • 服务端保存的 Salt1 和 Salt2 最好和用户数据分开存储,存到其他服务器的数据库里,这样即使被 SQL 注入,想要获得 Salt1 和 Salt2 也会非常困难。
  • 服务端校验两个哈希值是否相等时,使用时间恒定的比较函数,防止试探性时序攻击(Timing attack)。
  • 慢哈希算法 Bcrypt 只是在客户端进行运算的
  • 动态请求 Salt 值,还可以实现不升级客户端的情况下,对密码进行动态升级:服务端可定期更换 Salt2 ,重新计算 SaltHash2 ,让攻击者即使拖了一次数据也很快处于失效状态。

References